package com.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.reggie.DTO.DishDto;
import com.reggie.common.R;
import com.reggie.entity.Dish;
import com.reggie.entity.DishFlavor;
import com.reggie.mapper.DishMapper;
import com.reggie.service.DishFlavorService;
import com.reggie.service.DishService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Transactional//多张表控制时需要用到该注解   事务注解
@Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {
    /**
     * 新增菜品, 同时保存对应的口味数据
     */
    @Autowired
    DishFlavorService dishFlavorService;

    @Override
    public void setWithFlavor(DishDto dishDto) {
//因为这里继承了Iservice 所以共享了他的方法 所以用this
//        1.把基本信息保存到dish表 即 dishDto 因为DishDto继承了dish 所以共享了属性
        this.save(dishDto);
//        3.菜品的ID 因为 口味表里面也需要绑定菜品的id来进行区分
        Long dishID = dishDto.getId();
//          下面是把dish里的id存到flavor中
        List<DishFlavor> flavors = dishDto.getFlavors();//获取到json数组并把多个json封装到list集合中
//        .stream().map()  map是映射 把遍历出来的id映射为item
//        这里 flavors是一个集合 里面有多个json数据 我们把美一个json映射为item 然后用item调用获取id
        flavors = flavors.stream().map((item) -> {
            item.setDishId(dishID);//把每个遍历出来的json都设置一个id
            return item;
        }).collect(Collectors.toList());//将遍历出来的数据全部导入到list对象里面 所以我们要有一个list对象来接收
//        2.保存菜品口味到dishflavor(这里只传了name value 没有id)
        dishFlavorService.saveBatch(flavors);//批量存储  集合里面有多个json数组
    }

    /**
     * 根据id获取到菜品信息与口味信息  多表
     * dto里包含dish与 flavors
     *
     * @param id
     * @return
     */
    public DishDto getWithFlavor(Long id) {
        Dish dish = this.getById(id);
//        把dishdto补全 先把dish拷贝过去
//        这里查出来的是一个对象 所以用拷贝
        DishDto dishDto = new DishDto();
        BeanUtils.copyProperties(dish, dishDto);
//        根据id查口味 因为口味表里有存储dishid属性 所以用构造器条件查询
        LambdaQueryWrapper<DishFlavor> lqw = new LambdaQueryWrapper<>();
        DishFlavor dishFlavor = new DishFlavor();
        lqw.eq(DishFlavor::getDishId, id);
//        这里因为 一个id一个菜品对应有多个口味所以用列表的方式保存
        List<DishFlavor> dishFlavorlist = dishFlavorService.list(lqw);
//        这里是我们专门又把flavors的值查出来  所以可以直接赋值
        dishDto.setFlavors(dishFlavorlist);

        return dishDto;
    }

    //y用于更新 修改菜品
//    通过id去分别存储
    @Override
    @Transactional  //记得加事务注解 保证两表一致性
    public void updateWithFlavor(DishDto dishDto) {
//        更新dish
        this.updateById(dishDto);
//清理当前菜品对应的口味数据   dishflavor表的delete操作
//        如果数据库中的口味id与传过来的id相同 则删除
//        查找出id相同的数据  然后把整条数据删除
        LambdaQueryWrapper<DishFlavor> lambdaQueryWrapper = new LambdaQueryWrapper();
        lambdaQueryWrapper.eq(DishFlavor::getDishId, dishDto.getId());
        dishFlavorService.remove(lambdaQueryWrapper);
//        添加当前提交过来的口味数据  dishflavor表的insert操作
        List<DishFlavor> dishDtoflavors = dishDto.getFlavors();
//        直接这样保存的话 因为前端请求的时候传过来的值有dishid 但是当我们新增的时候不会给我们把id绑定到口味上 需要后端设置值
//        dishFlavorService.saveBatch(dishDtoflavors);
        List<DishFlavor> setId = dishDtoflavors.stream().map((item) -> {
            item.setDishId(dishDto.getId());
            return item;
        }).collect(Collectors.toList());
        dishFlavorService.saveBatch(setId);
    }
}
